package com.seeyoui.kensite.bussiness.exam.questionImport.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.seeyoui.kensite.bussiness.exam.questionImport.domain.QuestionDto;
import com.seeyoui.kensite.common.util.excel.ExcelUtil;

/**
 * 工具类读取Excel类中内容
 * @param <E>
 */
public class AnalyticalExcel {
	// 总行数
	private int totalRows = 0;
	// 总条数
	private int totalCells = 0;
	// 错误信息接收器
	private String errorMsg;

	// 构造方法
	public AnalyticalExcel() {
	}

	// 获取总行数
	public int getTotalRows() {
		return totalRows;
	}

	// 获取总列数
	public int getTotalCells() {
		return totalCells;
	}

	// 获取错误信息-暂时未用到暂时留着
	public String getErrorInfo() {
		return errorMsg;
	}

	/**
	 * 读EXCEL文件，获取试题信息集合
	 * 
	 * @param fielName
	 * @return
	 */
	public List<QuestionDto> getExcelProductModelInfo(File file) {
		// 初始化试题信息的集合
		List<QuestionDto> readExcelValue = new ArrayList<QuestionDto>();
		// 初始化输入流
		//InputStream inputStream = null;
		FileInputStream inputStream = null;
		Workbook workbook = null;
		try {
			// 根据新建的文件实例化输入流
			//inputStream = Mfile.getInputStream();;
			inputStream = new FileInputStream(file); 
			// 根据excel里面的内容读取客户信息
			//if(ExcelVail.isExcel2003(Mfile.getOriginalFilename())){
			if(ExcelUtil.isExcel2003(file.getName())){
				// 当excel是2003时
				workbook = new HSSFWorkbook(inputStream);
			//} else if(ExcelVail.isExcel2007(Mfile.getOriginalFilename())){
			} else if(ExcelUtil.isExcel2007(file.getName())){
				// 当excel是2007时
				workbook = new XSSFWorkbook(inputStream);
			}
			// 读取Excel里面客户的信息
			readExcelValue = readExcelProductValue(workbook);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					inputStream = null;
					e.printStackTrace();
				}
			}
		}
		return readExcelValue;
	}
	
	/**
	 * 读取Excel里面客户的信息
	 * @param <E>
	 * @param <E>
	 * 
	 * @param wb
	 * @return
	 */
	private List<QuestionDto> readExcelProductValue(Workbook workbook) {
		// 得到第一个shell
		Sheet sheet = workbook.getSheetAt(0);

		// 得到Excel的行数
		this.totalRows = sheet.getPhysicalNumberOfRows();

		// 得到Excel的列数(前提是有行数)
		if (totalRows >= 1 && sheet.getRow(0) != null) {// 判断行数大于一，并且第一行必须有标题（这里有bug若文件第一行没值就完了）
			this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
		} else {
			return null;
		}

		// 声明一个对象集合
		List<QuestionDto> questionDtos = new ArrayList<QuestionDto>();

		// 循环Excel行数,从第二行开始。标题不入库
		for (int r = 1; r < totalRows; r++) {
			Row row = sheet.getRow(r);
			if (row == null){continue;}
			
			QuestionDto questionDto = new QuestionDto();
			List<String> strings = new ArrayList<String>();
			int coloumNum=sheet.getRow(r).getPhysicalNumberOfCells();
			// 循环Excel的列
			for (int c = 0; c < coloumNum+1; c++) {
				//for (int c = 0; c < this.totalCells; c++) {
				Cell cell = row.getCell(c);
				
				if (null != cell) {
					if (c == 0) {
						// 设置试题内容
						questionDto.setContent(getValue(cell));
					} else if (c == 1) {
						// 设置试题类型
						questionDto.setQuestionTypeId(getValue(cell));
					} else if (c == 2) {
						// 设置试题答案
						questionDto.setAnswer(getValue(cell));
					} else if (c == 3) {
						// 设置试题解析
						questionDto.setAnalysis(getValue(cell));
					} else if (c > 3 && getValue(cell)!=null) {
						// 设置试题选项
						strings.add(getValue(cell));
					} 
				}
			}
			//给试题添加试题选项
			questionDto.setQuestionOption(strings);;
			// 添加试题对象到集合中
			questionDtos.add(questionDto);
		}
		return questionDtos;
	}


	/**
	 * 得到Excel表中的值
	 * 
	 * @param cell
	 *            Excel中的每一个格子
	 * @return Excel中每一个格子中的值
	 */
	private String getValue(Cell cell) {
		if (cell.getCellType() == cell.CELL_TYPE_BLANK) {
			return null;
		} else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
			// 返回数值类型的值
			return String.valueOf(cell.getNumericCellValue());
		} else if (cell.getCellType() == cell.CELL_TYPE_BOOLEAN){
			// 返回布尔类型的值
			return String.valueOf(cell.getBooleanCellValue());
		} else {
			// 返回字符串类型的值
			return String.valueOf(cell.getStringCellValue());
		}
	}
	
	/**
	 * 读取Excel里面试题信息是否合法
	 * @param <E>
	 * @param <E>
	 * 
	 * @param wb
	 * @return
	 */
	public boolean isTo(List<QuestionDto> excelInfo){
		//准备基础数据
		Set set = new HashSet();

		
		// 迭代添加客户信息（注：实际上这里也可以直接将customerTestList集合作为参数，在Mybatis的相应映射文件中使用foreach标签进行批量添加。）
		// 对excel对象进行遍历校验
		int j;
		boolean isPass = false;
		for (int i = 0; i < excelInfo.size(); i++) {
			
			// 定义一个错误提示的行数
			j = i + 2;
			QuestionDto productModelDto = excelInfo.get(i);
			
			// 第一校验:判断商品名称是否为空,为空则返回错误信息,不进行提交
			if (productModelDto.getContent() != null && !"".equals(productModelDto.getContent())) {
				
				// 第二校验:判断商品编码是否存在,存在则返回错误信息,不进行提交
				if (productModelDto.getAnswer()!=null){
					
					// 第三校验:判断商品品牌、分类、仓库、大单位、小单位是否存在,存在则数据OK,不存在则提示错误
					Set set2 = new HashSet();
					if(productModelDto.getQuestionTypeId()!=null){set2.add(productModelDto.getQuestionTypeId());}
						//通过验证设置通过
						isPass = true;
					}else {
					isPass = false;
					return isPass;
				}
			} else {
				
				isPass = false;
				return isPass;
			}
		}
		
		return isPass;

	}
	
	/**
	 * 读取Excel里面客户的信息
	 * @param <E>
	 * @param <E>
	 * 
	 * @param wb
	 * @return
	 * @throws IOException 
	 */
	private List<QuestionDto> readExcelQuestionValue(Workbook workbook) throws IOException {
		FileInputStream inp = new FileInputStream("E:\\WEIAN.xls"); 
		HSSFWorkbook wb = new HSSFWorkbook(inp);
		HSSFSheet sheet = wb.getSheetAt(2); // 获得第三个工作薄(2008工作薄)
		// 填充上面的表格,数据需要从数据库查询
		//HSSFRow row5 = sheet.getRow(4); // 获得工作薄的第五行
		//HSSFCell cell54 = row5.getCell(3);// 获得第五行的第四个单元格
		//cell54.setCellValue("测试纳税人名称");// 给单元格赋值
		//获得总列数
		//int coloumNum=sheet.getRow(0).getPhysicalNumberOfCells();
		int rowNum=sheet.getLastRowNum();//获得总行数
		for (int i = 0; i < rowNum; i++) {
			//获得第i行
			HSSFRow row = sheet.getRow(i);
			//获取行列数
			int coloumNum=sheet.getRow(i).getPhysicalNumberOfCells();
			for (int j = 0; j < coloumNum; j++) {
				HSSFCell cell = row.getCell(j);
				if(cell.getCellFormula()!=null){
					String s =  cell.getCellFormula();
				}
				
			}
		}
		
		return null;
	}
}
